package com.zzy.blog.json.jsonlib;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.util.JSONUtils;

/**
 * 
 * @author eason
 *
 */
@SuppressWarnings("unchecked")
public class JsonUtils {
	
	/**
	 * Object转换成jsonString
	 * @param obj 可以是基本类型，对象，嵌套对象，数组，Collection，Map
	 * 基本类型，对象，嵌套对象Map用JSONObject处理
	 * 数组，Collection用JSONArray处理
	 * @return
	 */
	public static String getJsonString(Object obj) {
		if(JSONUtils.isArray(obj)) {
			JSONArray jsonArray = JSONArray.fromObject(obj);
			return jsonArray.toString();
		}else{
			JSONObject jsonObject = JSONObject.fromObject(obj);
			return jsonObject.toString();
		}
	}
	
	/**
	 * jsonString转换成Object
	 * @param <T> Object类型
	 * @param jsonStr
	 * @param clazz Object的class类型
	 * @return
	 */
	public static <T> T getObject(String jsonStr, Class<T> clazz) {
		JSONObject jsonObject = JSONObject.fromObject(jsonStr);
		return (T) JSONObject.toBean(jsonObject, clazz); 
	}
	 
	/**
	 * jsonString转换成Object
	 * @param <T>
	 * @param jsonStr
	 * @param clazz
	 * @param clazzMap Object中list和map属性的名称和类型
	 * @return
	 */
	public static <T> T getObject(String jsonStr, Class<T> clazz, Map<String, Class> clazzMap) {
		JSONObject jsonObject = JSONObject.fromObject(jsonStr);
		return (T) JSONObject.toBean(jsonObject, clazz, clazzMap); 
	}
	
	/**
	 * jsonString转换成数组
	 * @param <T>
	 * @param jsonStr
	 * @param clazz
	 * @return
	 */
	public static <T> T[] getArray(String jsonStr, Class<T> clazz){
		JSONArray jsonArray = JSONArray.fromObject(jsonStr);
		return (T[]) JSONArray.toArray(jsonArray, clazz);
	} 

	/**
	 * jsonString转换成数组
	 * @param <T>
	 * @param jsonStr
	 * @param clazz
	 * @param clazzMap
	 * @return
	 */
	public static <T> T[] getArray(String jsonStr, Class<T> clazz, Map<String, Class> clazzMap){
		JSONArray jsonArray = JSONArray.fromObject(jsonStr);
		return (T[]) JSONArray.toArray(jsonArray, clazz, clazzMap);
	} 
	
	/**
	 * jsonString转换成list
	 * @param <T>
	 * @param jsonStr
	 * @param clazz
	 * @return
	 */
	@SuppressWarnings("deprecation")
	public static <T> List<T> getList(String jsonStr, Class<T> clazz){
		JSONArray jsonArray = JSONArray.fromObject(jsonStr);
		return  JSONArray.toList(jsonArray, clazz);
	} 
	
	/**
	 * jsonString转换成list
	 * @param <T>
	 * @param jsonStr
	 * @param clazz
	 * @return
	 */
	@SuppressWarnings("deprecation")
	public static <T> List<T> getList(String jsonStr, Class<T> clazz, Map<String, Class> clazzMap){
		JSONArray jsonArray = JSONArray.fromObject(jsonStr);
		return  JSONArray.toList(jsonArray, clazz, clazzMap);
	} 
	
	/**
	 * jsonString转换成map
	 * @param <T>
	 * @param jsonStr
	 * @param clazz
	 * @return
	 */
	public static <T> Map<String, T> getMap(String jsonStr, Class<T> clazz) {
        JSONObject jsonObject = JSONObject.fromObject(jsonStr);
        Map<String, T> map = new HashMap<String, T>();
        for(Iterator iter = jsonObject.keys(); iter.hasNext();){
            String key = (String)iter.next();
            JSONObject object = (JSONObject) jsonObject.get(key);
            map.put(key, (T) JSONObject.toBean(object));
        }
        return map;
    }
	
	/**
	 * jsonString转换成map
	 * @param <T>
	 * @param jsonStr
	 * @param clazz
	 * @return
	 */
	public static <T> Map<String, T> getMap(String jsonStr, Class<T> clazz, Map<String, Class> clazzMap) {
        JSONObject jsonObject = JSONObject.fromObject(jsonStr);
        Map<String, T> map = new HashMap<String, T>();
        for(Iterator iter = jsonObject.keys(); iter.hasNext();){
            String key = (String)iter.next();
            JSONObject object = (JSONObject) jsonObject.get(key);
            map.put(key, (T) JSONObject.toBean(object, clazz, clazzMap));
        }
        return map;
    } 
	
	
}
